#include "Fenetre.h"
#include "../Composant/Bouton.h"
#include <vector>

using namespace std;

Fenetre::Fenetre(string titre , SDL_Surface *ecran)
{

    //creation des ligne horizontal et vertical
    ligneHori =  SDL_CreateRGBSurface(SDL_HWSURFACE , ecran->w , 1 , 32, 0, 0, 0, 0) ;
    ligneVerti =  SDL_CreateRGBSurface(SDL_HWSURFACE , 1 , ecran->h , 32, 0, 0, 0, 0) ;

    SDL_FillRect(ligneHori, NULL, SDL_MapRGB(ecran->format, 231, 225, 211));
    SDL_FillRect(ligneVerti, NULL, SDL_MapRGB(ecran->format, 231, 225, 211));

    if(!titre.empty())
    {
        TTF_Font *police = TTF_OpenFont("arial.ttf", 50);
        SDL_Color rouge = {255,0,0};
        this->titre = TTF_RenderText_Blended(police, titre.c_str() , rouge);
        TTF_CloseFont(police);
    }
    else
        this->titre = NULL;

    this->ecran = ecran;
}


Fenetre::~Fenetre()
{
    SDL_FreeSurface(titre);
    SDL_FreeSurface(ligneHori);
    SDL_FreeSurface(ligneVerti);
}

void Fenetre::afficherMessage(string message)
{
     Bouton *ok =  new Bouton("ok" , "ressources/polices/angelina.TTF");
     afficherMessage(message , ok , NULL);
}

//la fonction doit toujour finir pas NULL si nan cela ne fonctionnera pas
void Fenetre::afficherMessage(string msg , Bouton *b1 , ...)
{
    int somme = 0;//la somme de tout les bouton pour pouvoir les centree
    int largMax = 0;

    va_list ap;
    vector<Bouton*> boutons;

    va_start(ap, b1);
    for (Bouton* bAct = b1 ; bAct != NULL ; bAct = va_arg(ap, Bouton*))
    {
        boutons.push_back(bAct);
        somme += bAct->w() + 10;
        if(bAct->h() > largMax)
            largMax = bAct->h();
    }

    //on initialise les surfaces
    TTF_Font *police = TTF_OpenFont("arial.ttf", 25);
    SDL_Color noir = {0,0,0};
    SDL_Surface *text = TTF_RenderText_Blended(police, msg.c_str() , noir);
    TTF_CloseFont(police);

    SDL_Surface *fond = SDL_CreateRGBSurface(SDL_HWSURFACE , ((text->w > somme ) ? text->w : somme) + 50 , text->h + largMax + 50 , 32, 0, 0, 0, 0) ;


    bool fin = false;
    SDL_Event event;
    SDL_PollEvent(&event);

    while(!fin)
    {
        switch(event.type)
        {
        case SDL_QUIT :
            exit(1);
            break;
        }


        SDL_FillRect(fond, NULL, SDL_MapRGB(fond->format, 200, 236, 125));


        SDL_Rect pos;
        pos.x = ecran->w/2 - fond->w/2;
        pos.y = ecran->h/2 - fond->h/2;

        SDL_BlitSurface(fond,NULL,ecran,&pos);

        SDL_Rect posi;
        posi.y = pos.y +10;
        posi.x = pos.x + fond->w/2 - text->w/2;

        SDL_BlitSurface(text , NULL , ecran , &posi);

        int sommeAct = 0;
        //on va parcourir tout les bouton pour les afficher
        for(vector<Bouton*>::iterator iter = boutons.begin(); iter != boutons.end() ; iter++){
            (*iter)->afficher(ecran , pos.x + fond->w/2 - somme/2 + sommeAct ,  pos.y + fond->h - (*iter)->h() - 10 , event);
            sommeAct += (*iter)->w() + 20;
            if((*iter)->isClicked()){
                fin = true;
            }
        }

        SDL_Flip(ecran);

        SDL_WaitEvent(&event);

    }


    SDL_FreeSurface(fond);
    SDL_FreeSurface(text);
}

//fonction pour afficher une ligne de saisie
bool Fenetre::afficherLigneSaisie(string titre , Line *ligneSaisie , ...){
    int hauteur = 0;
    int largMax = 0 ;
    va_list ap;
    vector<Line *> lignes;

    va_start(ap, ligneSaisie);
    for (Line* lAct = ligneSaisie ; lAct != NULL ; lAct = va_arg(ap, Line*))
    {
        lignes.push_back(lAct);
        hauteur  += lAct->getHeight() + 15;
        if(lAct->getWidth() + 40 > largMax)
            largMax = lAct->getWidth() + 40;
    }

    //on va crer deux bouton
    Bouton *bok =  new Bouton("ok" , "ressources/polices/angelina.TTF");
    Bouton *bannuler =  new Bouton("annuler" , "ressources/polices/angelina.TTF");

    if(bok->w() + bannuler->w() + 20 > largMax)
        largMax = bok->w() + bannuler->w() + 20;

    //on va charger le titre de la fenete
    SDL_Surface *surTitre = NULL;
    if(!titre.empty()){
        TTF_Font *police = TTF_OpenFont("arial.ttf", 25);
        SDL_Color noir = {0,0,0};
        surTitre = TTF_RenderText_Blended(police, titre.c_str() , noir);
        TTF_CloseFont(police);
        hauteur += surTitre->h + 10;
        if(surTitre->w + 10 > largMax)
            largMax = surTitre->w + 10;
    }

    SDL_Surface *fond = SDL_CreateRGBSurface(SDL_HWSURFACE ,largMax, hauteur + bok->h() + 30  , 32, 0, 0, 0, 0) ;


    bool fin = false;
    SDL_Event event;
    SDL_PollEvent(&event);


    while(!fin)
    {
        switch(event.type)
        {
        case SDL_QUIT :
            exit(1);
            break;
        }


        SDL_FillRect(fond, NULL, SDL_MapRGB(fond->format, 200, 236, 125));


        SDL_Rect pos;
        pos.x = ecran->w/2 - fond->w/2;
        pos.y = ecran->h/2 - fond->h/2;

        SDL_BlitSurface(fond,NULL,ecran,&pos);

        SDL_Rect posi;
        posi.y = pos.y + 20;
        posi.x = pos.x;

        //affichage du titre
        if(surTitre != NULL){
            SDL_Rect positionTitre;
            positionTitre.x = pos.x + fond->w/2 - surTitre->w/2;
            positionTitre.y = pos.y + 5;
            SDL_BlitSurface(surTitre , NULL , ecran , &positionTitre);
            posi.y = positionTitre.y + surTitre->h + 10;
        }

        //on va parcourir tout les ligne pour les afficher
        for(vector<Line*>::iterator iter = lignes.begin(); iter != lignes.end() ; iter++){
            (*iter)->setXY(pos.x +(fond->w/2 - (*iter)->getWidth()/2 ) , posi.y);
            (*iter)->afficher(event , ecran);

            posi.y += (*iter)->getHeight() + 15;
        }

        int somme = bok->w() + 10 + bannuler->w();

        bannuler->afficher(ecran , pos.x + fond->w/2 - somme/2 , pos.y + fond->h - bannuler->h() , event);
        bok->afficher(ecran , pos.x + fond->w/2 - somme/2 + bannuler->w() + 10, pos.y + fond->h - bok->h() , event);

        SDL_Flip(ecran);
        SDL_WaitEvent(&event);

        if(bok->isClicked() || bannuler->isClicked())
            fin = true;
    }

    bool retour = bok->isClicked();

    SDL_FreeSurface(fond);
    SDL_FreeSurface(surTitre);
    delete bok;
    delete bannuler;

    return retour;
}

void Fenetre::afficher()
{
    //couleur du fond
    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
    //on va afficher le fond
    int espace = 10;
    SDL_Rect posi ;
    posi.y = 0;

    for(int x = 0 ; x*espace < ecran->w ; x++)
    {
        posi.x = x*espace ;
        SDL_BlitSurface(ligneVerti,NULL,ecran,&posi);
    }

    posi.x = 0 ;
    for(int y = 0 ; y*espace < ecran->h ; y++)
    {
        posi.y = y*espace ;
        SDL_BlitSurface(ligneHori,NULL,ecran,&posi);
    }

    if(titre != NULL)
    {
        //affichage du titre
        SDL_Rect pos;
        pos.y = 10;
        pos.x = (ecran->w/2)-(titre->w/2);
        SDL_BlitSurface(titre,NULL,ecran,&pos);
    }

}
